////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#ifndef _GLOBALS_H_
#define _GLOBALS_H_

////////////////////////////////////////////////////////////////////////////////////////////////////

class CEventReceiver;


namespace  irr
{
	class IrrlichtDevice;	

	namespace video
	{
		class IVideoDriver;
	}
	namespace scene 
	{
		class ISceneManager;
		class ISceneNode;
		class ICameraSceneNode;
		class CGridSceneNode;
	}

	namespace gui
	{
		class IGUIEnvironment;
	}
	
	namespace io
	{
		class IAttributes;
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////

#include "irrString.h"
#include "dimension2d.h"
#include <map>

using namespace irr;
using namespace video;
using namespace scene;
using namespace gui;
using namespace core;
using namespace io;
////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////

enum E_CAMERA_TYPE 
{
	FPS_CAMERA,
	MAYA_CAMERA,	
	CAMERA_XZ,
	CAMERA_XY,
	CAMERA_YZ,
	CONTROL_POINT_CAMERA,
	CHANGE_CAMERA,
	CINEMATIC_CAMERA,
	NUM_CAMERA_TYPES
};

////////////////////////////////////////////////////////////////////////////////////////////////////

class CGlobals
{	
public:
	
	CGlobals();
	~CGlobals();
	
	CEventReceiver*					eventReceiver;
	irr::IrrlichtDevice*			device;
	irr::scene::ISceneManager*		sceneManager;	
	irr::gui::IGUIEnvironment*		guienv;
	irr::video::IVideoDriver*		driver;	
	
	f32								m_mayaCameraFar;
	f32								m_mayaCameraRotate;
	f32								m_mayaCameraZoom;
	f32								m_mayaCameraTranslate;

	irr::scene::ICameraSceneNode*	camera[NUM_CAMERA_TYPES];

	int						init();
	void					run( u32 time );
	void					close();				

	void					createCameras();
	int						getActiveCameraIndex() { return m_activeCameraIndex; };
	void					setActiveCamera(int cameraIndex);
	
	void					loadFonts();
	
	void					switchGrid();
	void					initScene();	

	irr::core::stringc		extractFileName(irr::core::stringc* fileName);
	irr::core::stringc		getRelativePath(irr::core::stringc fromPath, irr::core::stringc toPath);

	void					OnOffDeviceEmulatorMode(bool on);

	CGridSceneNode*			m_gridNode;
	irr::u32				m_gridSize;

	static const int k_deviceWidth=480;
	static const int k_deviceHeight=320;
	
	void AddToFrameNameMap(const char* frameName, int frameID);
	int FindFrameIDByName(const char* frameName);

private:		
	int						m_activeCameraIndex;
	irr::core::stringw		m_versionStr;
	irr::core::stringw		m_fpsStr;

	irr::core::dimension2di m_screenSizeSaved;
	bool	m_hideGUI;

	typedef std::map<irr::core::stringc, int> FrameNameMap;
	FrameNameMap m_frameNameMap;

public:

static irr::u32				m_versionMajor;
static irr::u32				m_versionMinor;
static irr::u32				m_versionBuild;
	
};

#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
